#include "global.h"

doubleball DBGrid::LAST_TERM;//最后一期记录

BEGIN_EVENT_TABLE(DBGrid,wxGrid)
   EVT_GRID_CELL_CHANGE(DBGrid::GridEditEvtHandler)//nice.
   EVT_KEY_DOWN(DBGrid::OnKeyDown)
END_EVENT_TABLE()

DBGrid::DBGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style , const wxString& name):wxGrid(parent,id,pos,size,style, name)
{

}
void DBGrid::OnKeyDown(wxKeyEvent &event)
{

 wxGrid::OnKeyDown(event);
   int row = BFrame->Grid1->GetCursorRow(),
        col =BFrame->Grid1->GetCursorColumn();
  wxString value=wxEmptyString;
  wxString values[6];
  int beingcount=0;//不为空计算
  int continumemptycount=0;//连续空位计算
   for(int i=1;i<=6 && row-i>0 ;i++)
    {
     values[i-1]=BFrame->Grid1->GetCellValue(row-i,col);
     if(values[i-1]==wxEmptyString)continumemptycount++;
     if(values[i-1]!=wxEmptyString && i<6)//必须只计算5期内的个数
     {
     beingcount++;
      if(continumemptycount<2)continumemptycount=0;//不连续空百
     }
    }
  if(row>0)
  {
   value=BFrame->Grid1->GetCellValue(row-1,0);//上一期term
   LAST_TERM = doubleball(value);//上一行记录
  }
debug(wxT("on key down...term:")+value +wxString::Format(wxT("....row:%02d,col:%02d"),row,col));
  switch(((wxKeyEvent&)event).GetKeyCode())
      {
     case WXK_UP:
     case WXK_DOWN:
     case WXK_LEFT:
     case WXK_RIGHT:
            //得到上一期数字
            wxArrayString result = getSelectedGridRowRedBall(BFrame->Grid1,-1);
            result.Sort();
            switchHashMap distance=getRedballDistance(result);
            wxArrayString distArray=hashmap2array(distance);

            wxArrayString matchs;//匹配的规则
            wxString tmp;
            value=wxEmptyString;
            if(col>1 && col< BFrame->Grid1->GetNumberCols()-1)
            {
               value=BFrame->Grid1->GetCellValue(row,col);//当前值
             }else
             {
              return;
             }
//              if(value==wxEmptyString)//当前cell值
//              {
               //得到上一行的间隔记录
              wxString dirtyvalue=DoubleBallGridCellRenderer::DIRTTABLE->GetValue(row-1,col);

              wxString upon =BFrame->Grid1->GetCellValue(row-1,col);
//              if(upon==wxEmptyString)
//               {
                  int nextCol=col-1;
                  long intv;
                if(dirtyvalue!=wxEmptyString )
                {
                    bool yesmatch=false;
                    dirtyvalue.ToLong(&intv,10);
                  if(upon==wxEmptyString&& result.Index(dirtyvalue.c_str())!=wxNOT_FOUND && intv>5) //间隔同上一期号码相同,并且大于9的分析
                  {
                   matchs.Add(wxT("间隔等于上期红球数字...")+dirtyvalue);
                  }
                //add for 间隔个位数同当前列红球相同
                 if(intv%10 == (col-1)%10  && upon==wxEmptyString && intv>3)//间隔大于3之后的概率比较高
                   {
                    matchs.Add(wxT("间隔个数和当前红球数字一致"));
                   }

//                 long tv=0;
//                 int tens =nextCol%10;
//                 dirtyvalue.ToLong(&tv,10);
//                  wxString info;
//
//                 if(upon==wxEmptyString&& tv==tens || pow(tens,2)==tv)//间隔同个位数相同,或者平方 nice极其可能出
//                   {
//                    matchs.Add(wxT("间隔符合 .个位数字和间隔数字相等.规则"));
//                   }
                   //判断1,3和3,5重复模式
                   wxLogMessage(wxT("value:")+values[0]
                                +wxT(",")+values[1]
                                +wxT(",")+values[2]
                                +wxT(",")+values[3]
                                +wxT(",")+values[4]
                                +wxT(",")+values[5]+wxT(","));
                    if(values[0]!=wxEmptyString &&
                       ((values[1]==wxEmptyString //间隔空1,3
                       &&values[2]!=wxEmptyString
                       &&values[3]==wxEmptyString
                       &&values[4]==wxEmptyString
                       &&values[5]==wxEmptyString
                       )||//1,3...出来
                        (values[1]==wxEmptyString && values[2]==wxEmptyString &&values[3]==wxEmptyString
                         )//1,5
                        )
                       )
                       {
                        matchs.Add(wxT("符合1，3或3，5或1,3,5 或当前1,3,5间隔规则"));
                       }
                    //间隔为1,3
                    if(values[0]==wxEmptyString &&
                       ((values[1]!=wxEmptyString //间隔空1,3
                       &&values[2]==wxEmptyString
                       &&values[3]==wxEmptyString
                       &&values[4]==wxEmptyString
                       &&values[5]==wxEmptyString
                       )
                        )
                       )
                       {
                        matchs.Add(wxT("符合间隔空1，3"));
                       }
//                      //其他空位组合
//                      if(beingcount>0 && continumemptycount>1 )
//                      {
//                          if(values[4]!=wxEmptyString && values[5]!=wxEmptyString)//如果5不为空,6期必须为空
//                          {
//                             //skip this case
//                          }else
//                             {
//                             matchs.Add(wxT(" 符合 5期内连续两个空位!"));
//                             }
//                      }
//                      //得到垂直间隔和水平间隔都相等的数字
//                        long vertical=0;//垂直的
//                        dirtyvalue.ToLong(&vertical,10);
//                        long Horizontal=0;
//
//                        for(int i=0;i<BFrame->Grid1->GetNumberCols()-col-1;i++)
//                        {
//                        wxString uponRowValue= BFrame->Grid1->GetCellValue(row-1,col+i);//当前值
//                        if(uponRowValue==wxEmptyString){Horizontal++;}else
//                        {
//                         break;//碰到非0跳出
//                        }
//                        }
//                       if(Horizontal==vertical && Horizontal>0)
//                       {
//                           matchs.Add(wxT("..三角形:垂直(")+int2wxString(vertical)+wxT(")和水平(")+int2wxString(Horizontal)+wxT(")间隔相等.."));
//                       }
//                     int dis=0;
//                      dis=getMinRedbalDistance( result);
//
//                     //发现间隔符合符合的数字DoubleBallGridCellRenderer:: DIRTTABLE
//                     if(matchs.GetCount()>0 && dis<=2)//目前只考虑间隔等于1和2的数字
//                       {
//                        int num=col-1-1;
//                         num=(num>1)?num:33;//如果5不为空,6期必须为空
//                        int num2=col-1+1;
//                        num2=(num2>33)?1:num2;
//
//                        value.Printf(wxT("%02d"),num);
//                        wxString value2;
//                        value2.Printf(wxT("%02d"),num2);
//                        debug(wxString::Format(wxT("%02d,%02d,"),num,num2));
//                        if(  result.Index(value)!=wxNOT_FOUND)
//                         {
//                          matchs.Add(wxT("斜线+1符合,")+value);
//                         }
//                         if(result.Index(value2)!=wxNOT_FOUND)
//                         {
//                           matchs.Add(wxT("斜线+1符合,")+value2);
//                         }
//                       }
//                    //察看相亲数
//                      wxString colValue=wxString::Format(wxT("%02d"),col-1);
//                      wxArrayString folk=guessFolk(result);
//                     if(folk.Index(colValue)!=wxNOT_FOUND)
//                     {
//                      matchs.Add(wxT(".上期数字的相亲数."));
//                     }
//                   //最近三期间隔
                     int dirtyIndex=0;
                     int Recently_Range=3;
                     long colValues[Recently_Range];
                     wxString lastValue=wxEmptyString;
                     wxString colValue4dirty=wxEmptyString;
                     wxString colValue4grid=wxEmptyString;

                    for(int t1=row;t1>0;t1--)
                    {
                    colValue4dirty=DoubleBallGridCellRenderer::DIRTTABLE->GetValue(t1-1,col);
                    //wxLogMessage(wxT("...dirty..")+colValue4dirty);
                    colValue4grid =BFrame->Grid1->GetCellValue(t1-1,col);
                     //if grid is not empty

                    //wxLogMessage(wxString::Format(wxT("Row,col:%02d,%02d"),t1,col)+wxT(" dirTy:")+colValue4dirty+wxT(" grid:")+colValue4grid);
                    if( colValue4dirty==colValue4grid && colValue4grid!=wxEmptyString)
                      {
                              if((t1!=row)&&lastValue==wxEmptyString)//first turn or repeat!
                              {
                              colValues[dirtyIndex]=0;//repeat!
                               dirtyIndex++;
                              }else
                              {
                                lastValue=wxEmptyString;//set indicator trigger
                                continue;
                              }

                      }else //
                      {
                       if(lastValue==wxEmptyString)//last is real number
                       {
                          colValue4dirty.ToLong(&colValues[dirtyIndex],10);
                          dirtyIndex++;
                          lastValue=colValue4dirty;
                       }
                      }
                      if(dirtyIndex>(Recently_Range-1))break;//skip
                    }

   wxString tstr=wxEmptyString;
                    for(int i=0;i<Recently_Range;i++)
                    {
   tstr=tstr+ wxString::Format(wxT("....%02d "),colValues[i]);
                    }
wxLogMessage(wxT("最近几期间隔:") +tstr);
if(abs(colValues[0]-colValues[1])==colValues[2]
   ||abs(colValues[0]-colValues[2])==colValues[1])
   matchs.Add(wxT(".间隔符合数学运算")+tstr);
//                   //间隔相关算法,魔数匹配
//                   for(int i=0;i<PrimeMagicSize;i++)
//                   {
//                            if(PrimeMagic[i]==colValues[0])//最近匹配
//                             {
//                              matchs.Add(wxT(".质数魔数匹配")+wxString::Format(wxT("%02d,"),colValues[0]));
//                             }
//                   }
//                   //发现平方数
//                   for(int i=0;i<squareMagicSize;i++)
//                   {
//                            if(squareMagic[i]==colValues[0])//最近匹配
//                             {
//                              matchs.Add(wxT(".平方魔数匹配")+wxString::Format(wxT("%02d,"),colValues[0]));
//                             }
//                   }
//
//                   //间隔相关算法，间隔数字成+-x/比例
//                   //+法
//                   wxString maths=GraphOfArray(colValues,3);
//                   if(maths!=wxEmptyString)
//                    matchs.Add(wxT(".数学图式..")+maths);
//                   //有符合的条件显示该数字
//                   wxString debugstr;
//                   debugstr.Printf(wxT("-间隔:%02d,%02d,%02d"),colValues[0],colValues[1],colValues[2]);
//                   debug(arrary2string(matchs)+wxT("------")+arrary2string(distArray)+debugstr);
                   if(matchs.GetCount()>0)
                   {
                  tmp.Printf(wxT("%02d"),nextCol);
                  BFrame->Grid1->SetCellValue(row,col,tmp);
                  BFrame->Grid1->SetCellTextColour(row,col,wxColour(0,148,0));
                   }

debug(wxT("on key down...term:")+value +wxString::Format(wxT("....row:%02d,col:%02d"),row,col)+wxT(":")+arrary2string(matchs));
                }
//               }
//              }
              break;

      }


}
DBGrid::DBGrid()
{
    //ctor
}

DBGrid::~DBGrid()
{
    //dtor
}
void DBGrid::GridEditEvtHandler(wxGridEvent& event)
{

  int row = event.GetRow(),
        col = event.GetCol();
  wxString value=BFrame->Grid1->GetCellValue(row,col);
    wxString tmp;
           long colvalue=-1;
           value.ToLong(&colvalue,10);
  if(value!=wxEmptyString && value.IsNumber())//validation
     {
       if(col>1 && col<BFrame->Grid1->GetNumberCols()-1)//redball range
         {
           if(colvalue!=(col-1))
           {
               tmp.Printf(wxT("%02d"),col-1);
             wxMessageBox(wxT("错误,本列是:")+tmp);
             BFrame->Grid1->SetCellValue(row,col,wxEmptyString);
            return;
           }
         }
     }else if(value!=wxEmptyString && col>1 && col<BFrame->Grid1->GetNumberCols()-1)//not number
     {
             tmp.Printf(wxT("%02d"),col-1);
             wxMessageBox(wxT("必须是数字,错误,本列是:")+tmp);
             BFrame->Grid1->SetCellValue(row,col,wxEmptyString);
            return;
     }

  if(value!=wxEmptyString && col>1 && col<BFrame->Grid1->GetNumberCols()-1)
    {
     if(coubles[col-2]!=-1)
     {
      int nextCol=coubles[col-2];
      tmp.Printf(wxT("%02d"),nextCol);
      BFrame->Grid1->SetCellValue(row,nextCol+1,tmp);
      //http://www.colorschemer.com/online.html
      BFrame->Grid1->SetCellTextColour(row,nextCol+1,wxColour(145,0,194,100));
     return;
     }
    }//DoubleBallGridCellRenderer::DIRTTABLE
//GlobalEvtHandler::LAST_TERM

   event.Skip();
}
